package com.tyros.common.kit.web.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tyros.common.kit.web.model.PageQuery;
import com.tyros.common.kit.web.model.PageResult;

import java.io.Serializable;
import java.util.List;

/**
 * 基本Service接口，封装通用数据库操作
 *
 * @param <D> DTO
 * @param <T> Entity
 * @author zhangshuaiyin
 * @date 2022/1/15 21:15
 */
public interface IBaseService<D, T> extends IService<T> {

    /**
     * 根据主键查询
     *
     * @param id 主键id
     * @return DTO
     */
    D get(Serializable id);

    /**
     * 根据条件查询
     *
     * @param queryWrapper 查询条件
     * @return DTO
     */
    D selectOne(Wrapper<T> queryWrapper);

    /**
     * 根据条件查询
     *
     * @param dto 查询条件, 根据非空字段自动拼接条件
     * @return DTO
     */
    D selectOne(D dto);

    /**
     * 根据条件查询列表
     *
     * @param dto 查询条件, 根据非空字段自动拼接条件
     * @return DTO List
     */
    List<D> list(D dto);

    /**
     * 根据id更新记录
     *
     * @param dto D
     * @return 是否成功
     */
    boolean update(D dto);

    /**
     * 插入记录
     *
     * @param dto D
     * @return 是否成功
     */
    boolean insert(D dto);

    /**
     * 插入或更新
     *
     * @param dto D
     * @return 是否成功
     */
    boolean insertOrUpdate(D dto);

    /**
     * 批量删除
     *
     * @param ids id列表
     * @return 是否成功
     */
    boolean delete(List<Serializable> ids);

    /**
     * 分页查询
     *
     * @param pageQuery 分页查询入参
     * @return 分页结果
     */
    PageResult<D> page(PageQuery pageQuery);

    /**
     * 分页查询，返回指定实体类型
     *
     * @param pageQuery 分页查询入参
     * @param clz       转换对象class
     * @return 分页结果
     */
    <R> PageResult<R> page(PageQuery pageQuery, Class<R> clz);

    /**
     * 批量插入或更新
     *
     * @param list D
     * @return 是否成功
     */
    boolean insertBatch(List<D> list);
}
